package com.example.springbootdemo.controller;

import com.example.springbootdemo.service.AsyncService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

@RestController
@RequestMapping("/async")
public class MyController {

    @Autowired
    private AsyncService asyncService;

    /**
     * 测试无返回值的异步方法
     * 观察：主线程立即返回，异步方法在另一个线程执行
     */
    @GetMapping("/simple")
    public String testSimpleAsync() {
        System.out.println("🎯 ========== 开始测试无返回值异步方法 ==========");
        System.out.println("📝 主线程: " + Thread.currentThread().getName());

        // 这个方法会立即返回，不会等待异步方法完成
        asyncService.asyncMethodWithoutReturn();

        System.out.println("✅ ========== 主线程立即返回，异步任务在后台执行 ==========");
        return "异步任务已启动，请查看控制台输出";
    }

    /**
     * 测试带返回值的异步方法
     * 使用Future获取异步结果
     */
    @GetMapping("/with-result")
    public String testAsyncWithResult() throws InterruptedException, ExecutionException, TimeoutException {
        System.out.println("🎯 ========== 开始测试带返回值异步方法 ==========");
        System.out.println("📝 主线程: " + Thread.currentThread().getName());


        // 启动异步任务，返回Future
        Future<String> futureResult = asyncService.asyncMethodWithReturn();

        // 主线程可以继续做其他事情
        System.out.println("🔄 主线程继续处理其他任务...");
        Thread.sleep(500); // 模拟主线程做其他工作
        System.out.println("🔄 主线程其他任务处理完成");

        System.out.println("等待异步线程处理结果");
        // 在需要结果时获取（会阻塞直到结果可用）
        String result = futureResult.get(5, TimeUnit.SECONDS);
        System.out.println("📨 异步结果: " + result);

        System.out.println("✅ ========== 带返回值异步方法测试完成 ==========");
        return "异步结果: " + result;
    }

    /**
     * 使用特定线程池的异步方法
     */
    @GetMapping("/send-email")
    public String sendEmail(@RequestParam String to, @RequestParam String content) {
        System.out.println("🎯 ========== 开始测试邮件发送异步方法 ==========");
        System.out.println("📝 收到发送邮件请求，主线程: " + Thread.currentThread().getName());
        System.out.println("📧 邮件信息 - 收件人: " + to + ", 内容: " + content);


        // 使用ioTaskExecutor线程池执行
        asyncService.sendEmail(to, content);

        System.out.println("✅ ========== 邮件发送任务已提交，主线程任务完成。 ==========");
        return "邮件发送任务已提交，收件人: " + to;
    }
}